正規式也可以叫做正則表達式,在 JavaScript 中可以使用兩個 /
或 new RegExp
來建立,且其型別為物件
const ares = /a+87/
const ares = new RegExp('a+87')
typeof /a+87/
// object
如需要測試也可使用regex101
正規式常常會用在搜尋
與取代
兩個地方,讓我們看看如何使用
使用 test
方法可以檢視是否有符合字串,會回傳 true
或是 false
const ares = "Hello everybody, I am a loner."
/friend/.test(ares)
// false
JavaScript 中取代我們會使用 replace
方法,這時候就可以使用正規式
const ares = "Hello everybody, I am a loner."
ares.replace(/loner/, "loser")
// "Hello everybody, I am a loser."
除了單純使用字元來過濾以外,正規式還有許多功能語法,這裡列出大部分的語法~
\
\^
表示匹配 ^ 符號|
/aa|cc/
匹配 aabbcc
中的 aa 或 cc^
/^abc/
表示字串開頭須為 abc[]
內則為排除字串,例如: /[^abc]/
表示排除所有 abc 開頭字串$
^
相反,表示字尾須匹配的字串,須加在字元後方/abc$/
表示匹配所有 abc 結尾的字串*
/bo*/
匹配 booed
中的 boo+
/bo+/
不會匹配 brooded
中的任何字元?
/bo?/
匹配 booed
中的 bo.
[]
-
來指定一個範圍/[a-z]/
表示匹配 a 到 z 的所有字元{n, m}
/a{0, 2}/
表示匹配 a 出現 0~2 次的字串()
/(foo)(bar)\1\2/
可匹配 foobarfoobar
,\1
= foo、\2
= bar$
符號const abc3 = "foobarfoobar"
abc3.replace(/(foo)(bar)\1\2/, '$1')
// "foo"
(?:y)
()
,但是不會記憶群組x(?=y)
x(?!y)
這類有些有大小寫,大小寫匹配的字元都是互補的
\w
[A-Za-z0-9_]
\W
[A-Za-z0-9_]
以外的字元\s
/\s\w*/
匹配 foo bar
中的 bar\S
/\S\w*/
匹配 foo bar
中的 foo\d
[0-9]
\D
[^0-9]
\b
/\bm/
匹配 moon
中的 m\B
/\B../
匹配 noonday
中的 oo\r
\n
\t
\xhh
、\uhhhh
/[\x21]/
、/[\u4E00-\u9FA5]/
參數會寫在 /
後方
// 單個參數
const ares = /a+87/g
const ares = new RegExp('a+87', 'g')
// 多個參數
const ares = /a+87/gi
const ares = new RegExp('a+87', 'gi')
再來介紹參數的種類,目前 JavaScript 不只這三種,但是這三個最常用的~
g
:global,範圍為全域,不加此參數只會找到第一個i
:insensitive,不區分大小寫m
:muliti line,可匹配多行,主要應用於 ^
與 $
符號// 加上 \n 會換行
const abc1 = "abc123\nabc123\nabc123"
const abc2 = "abc123abc123abc123"
// g
abc2.replace(/a/, "b")
// "bbc123abc123abc123"
abc2.replace(/a/g, "b")
// "bbc123bbc123bbc123"
// i
abc2.replace(/A/gi, "b")
// "bbc123bbc123bbc123"
// m
abc1.replace(/^A/gim, "b")
// "bbc123\nbbc123\nbbc123"
以上就是正規式的簡易介紹,試著用正規式來做一些事情吧!